#include "FTPlib.h"
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>

#define MSG_INIT "\n\t\t***Cliente FTP -- Redes 2012***"

/*
 * Imprime el prompt en consola, según el modo.
 */
void prompt(int i){		
	if (i==0)
		printf("/A=>");
	else if (i>0)
		printf("/P=>");
	else
		printf("/=>");
}

/*
 * Auxiliar, pasa a minúsculas la cadena de texto ingresada, hasta encontrar
 * un espacio.
 */
void toLowerCase(char string[]){		
	char *resul;
	for (resul = string;*resul != ' ';resul++){
		*resul = tolower(*resul);
	}	
}


/*
 * Ciclo principal del programa. Parsea la entrada del usuario, y ejecuta el comando
 * que corresponde a dicha entrada.
 */
void mainLoop(char serverIp[],char serverPort[]){	
	char input[256];
	char inputOriginal[256];
	
	int modo = -1; //0 = activo, 1 = pasivo	
	
	if(!(open(serverIp,serverPort) == 0)){
		printf("Conexión fallida\n");		
	}	
	while(1){		
		prompt(modo); //el prompt del programa, según el modo de conexión de datos.
		//se obtiene y parsea el input del usuario.
		fgets(inputOriginal,256,stdin);		
		toLowerCase(inputOriginal);
		pseudoTrans(inputOriginal,input);		
		
		//se comparan los comandos FTP con el input parseado del usuario.
		if (strncasecmp("user",input,4)==0){		
			user(&input[5]);						
		}
		if (strncasecmp("open",input,4)==0){
			char *port;
			char *ip;			
			ip = strtok(&input[5],":");
			port = strtok(NULL,"\n");
			if (port == NULL){ //si puerto es nulo, no se ingresó, por lo que el primer
				ip = strtok(ip,"\n"); //strtok tomó TODO el ip incluido el enter.
				port = "21";
			}
			if(!open(ip,port) == 0){
				printf("Conexión fallida\n");
			}
		}
		else if (strncasecmp("passive",input,7)==0){
			passive();
			modo = 1;
		}
		else if (strncasecmp("active",input,6)==0)	{		
			active();
			modo = 0;
		}
		else if (strncasecmp("pass",input,4)==0)
			pass(&input[5]);
		else if (strncasecmp("pwd",input,3)==0){			
			pwd();}
		else if (strncasecmp("quit",input,4)==0)
			quit();
		else if (strncasecmp("list",input,4)==0){			
			list();	
		}				
		else if (strncasecmp("cd",input,2)==0){			
			cd(&input[3]);	
		}
		else if (strncasecmp("get",input,3)==0){			
			get(&input[4]);	
		}
		else if (strncasecmp("put",input,3)==0){			
			put(&input[4]);	
		}
		else if (strncasecmp("\n",input,1)==0){}
		else{			
			printf("Comando desconocido\n");
			continue;
		}
		
	}
}
/*
 * Función principal del programa
 */
int main(int argc, char *argv[]){	
	
	char input[256];		
	char *ip; 		
	char *puerto;
	
	printf("%s\n",MSG_INIT);//Mensaje inicial del programa
	
	//se establece la salida estándar como la salida predeterminada
	//del modulo FTPlib.
	setOutput(stdout);
	if(argc == 1){
		
		//ayuda para el usuario, si ejecuta el programa sin argumentos
		printf("\topen <ip> <puerto> para conectarse a un servidor FTP\n\n");
		
		//contempla los casos donde el usuario ingrese texto antes de abrir
		//una conexion.
		while(strncasecmp("open",input,4)!=0){
			printf("/=>");
			fgets(input,256,stdin);			
			if(strncasecmp("quit",input,4)==0)
				quit();
			else if (strncasecmp("open",input,4)!=0 && strncasecmp("\n",input,1))
				printf("\tLa conexión aún no se ha realizado, para ingresar cualquier comando,\n\tutilice primero el comando \'open\'\n");			
		}
		
		ip = (char *) strtok(&input[5],":");	
		puerto = (char *) strtok(NULL,"\n");
		
		if(puerto == NULL){	//no puso puerto -> no hubo : -> la ip tiene un enter!
			ip[strlen((char *)ip)-1] = '\0';
			mainLoop(ip,"21");
		}
		else
			mainLoop(ip,puerto);
	}
	else if(argc == 2){
		ip = (char *)strtok(argv[1],":");	
		puerto = (char *) strtok(NULL,"\n");
		if (puerto == NULL)
			puerto = "21";
		mainLoop(ip,puerto);
	}
	else{
		printf("Error de sintaxis, intente clienteFTP -h\n");
	}
	
	
	
}
